//WHERE 和 ORDER 拼接后的条件
  private $filter = '';

   //查询条件
  private $param = array();

  /**
   * 查询条件拼接
   *
   * @param array $where 限定条件的参数设置，数组里存放着字符串,例如[]
   * @param array $param 存放要绑定的数据
   * @return $this 当前对象
   */
  public function where($where = array(), $param = array())
  {
    if ($where) {
      $this->filter .= 'WHERE ';
      // $this->filter .= implode(' ', $where);
      $this->filter .= implode(' and ', $where);
      // var_dump($param);
      $this->param = $param;
    }
    return $this;
  }

  /**
   * 拼接查询字段，放在where的后面
   *
   * @param array $order 存放字符串，例如['id DESC']
   * @return $this 对象
   */
  public function order($order = array())
  {
    if ($order) {
      $this->filter .= ' ORDER BY ';
      $this->filter .= implode(',', $order);
    }
    return $this;
  }

  /**
   * 查询全部数据
   *
   * @param array $fetch 默认为查询全部，数组应该存放要查询的字段，例如['id','name']
   * @return $result->fetch_all() $result 为 mysqli 的结果集对象，使用fetch_all 以数组的形式返回所有结果
   */
  public function fetchALL($fetch = ['*'])
  {
    //需要查询的字段
    
    $field = implode(' ', $fetch);
    $sql = sprintf("SELECT $field FROM %s %s", $this->table, $this->filter);
    echo($sql);
    $stmt = DB::mysqli()->prepare($sql);
    // var_dump($stmt);
    $stmt = $this->formatParam($stmt, $this->param);
    $stmt->execute();

    //获取结果
    $result = $stmt->get_result();
    return $result->fetch_all();
  }


  // public function fetch()
  // {
  //   //需要查询的字段
  //   $field = implode(' ',$fetch);
  //   $sql = sprintf("SELECT $field FROM %s %s",$this->table,$this->filter);
  //   $stmt = DB::mysqli()->prepare($sql);

  //   $stmt = $this->formatParam($stmt, $this->param);
  //   $stmt->execute();

  //   //获取结果
  // }

  /**
   * 删除数据
   *
   * @param int $id 要删除的数据的id
   * @return mysqli_stmt_affected_rows($stmt) 返回受sql影响的行数
   */
  public function delete($id)
  {
    $sql = sprintf("DELETE FROM %s WHERE %s = :%s",$this->table,$this->primary,$this->primary);
    $stmt = DB::mysqli()->prepare($sql);
    $stmt = $this->formatParam($stmt,[$this->primary => $id]);
    $stmt->execute();

    return mysqli_stmt_affected_rows($stmt);
  }

  /**
   * 增加数据
   *
   * @param array $data 要插入的数据
   * @return  mysqli_stmt_affected_rows($stmt) 返回受sql影响的行数
   */
  public function add($data)
  {
    $sql = sprintf("INSERT INTO %s %s",$this->table,$this->formatInsert($data));
    $stmt = DB::mysqli($sql);
    $stmt = $this->formatParam($stmt, $data);
    $stmt->execute();
    return mysqli_stmt_affected_rows($stmt);
  }

  /**
   * 更新数据
   *
   * @param array $data 要更新的数据
   * @return mysqli_stmt_affected_rows($stmt) 返回受sql影响的行数
   */
  public function update($data)
  {
    return mysqli_stmt_affected_rows($stmt);
  }

  /**
   * 绑定数据
   *
   * @param mysqli_stmt $stmt mysqli的预处理对象
   * @param array $params 查询条件数据的数组，和where对应。
   * @return $stmt 返回的是mysqli的预处理对象，这个对象已经绑定好数据了
   */

   // 问题  这样写有问题的，如果参数过多，就又变了。
  public function formatParam(mysqli_stmt $stmt, $params = array())
  {
    $binddata = array();
    foreach ($params as $param => &$value) {
    //   echo($param);
      $param = is_int($param) ? $param + 1 : ':' . ltrim($param, ':');
    //   // $binddata[$param]  = $value;
    //   // var_dump($binddata);
      array_push($binddata,$value);
      // $stmt->bind_param($param,$value);
    }
    $stmt->bind_param('ss',$binddata[0],$binddata[1]);
    
    // $value = 'koga';
    // $stmt->bind_param('s', $value );
    // $param = ':username';
    // $binddata = "'".implode("','",array_keys($binddata))."'";
    // var_dump($binddata);
    
    // $stmt->bind_param('ss',$username,$pwd);
    // $username = ':username';
    // $pwd = ':password';